package com.tul.exercise.base.utils;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import static com.tul.exercise.base.utils.Print.print;

/**
 * @author tuliang
 *         Class相关的方法
 */
public class ClassUtils {
    /**
     * 存储类的基类字符串
     */
    private static List<String> superClassStr = new ArrayList<>();

    /**
     * 获取对象基类的名称列表
     *
     * @param obj 对象
     * @return 对象基类名称列表
     */
    public static List<String> getSuperClassName(Object obj) {
        List<String> result = new ArrayList<>();
        superClassStr.clear();
        getSuperClass(obj.getClass());
        superClassStr.forEach(name -> result.add(name));
        superClassStr.clear();
        return result;
    }

    /**
     * 获取对象域名称
     * @param obj 对象
     * @return 域名称列表
     */
    public static List<String> getFieldInfo(Object obj) {
        List<String> result = new ArrayList<>();
        Class clazz = obj.getClass();
        List<Field> fields = Arrays.asList(clazz.getDeclaredFields());
        fields.forEach(field -> result.add(field.getName()));
        return result;
    }

    /**
     * 打印对象域名称
     * @param obj 对象
     */
    public static void printFieldInfo(Object obj) {
        Class clazz = obj.getClass();
        List<Field> fields = Arrays.asList(clazz.getDeclaredFields());
        fields.forEach(field -> {
            print("fieldName:" + field.getName());
            print("fieldType:" + field.getType().getSimpleName());
            print("annotation:" + field.getAnnotations());
            print("modifier:" + field.getModifiers());
            print("\n");
        });

    }



    /**
     * 将对象的基类名称加入到数组superClassStr中
     *
     * @param clazz 对象类型
     */
    private static void getSuperClass(Class clazz) {
        // 对象类型的基类
        Class superClazz = clazz.getSuperclass();
        // 基类的名称
        String superClazzName = clazz.getSuperclass().getSimpleName();
        // 将基类名称加入到基类名称list中
        superClassStr.add(superClazzName);

        // 基类不是Object,递归调用本函数
        if (!superClazzName.equals("Object")) {
            getSuperClass(superClazz);
        }
    }
}
